﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Viaticos.Entities;
using HerGoS.Interfaces;
using HerGoS.DAO;
using System.Data;
using HerGoS.Administration.Engine;
using HerGoS.Viaticos.Exceptions;
using HerGoS.Administration.Entities;

namespace HerGoS.Viaticos.Engine
{
    public class GestorSolicitudes
    {
        public static Solicitud Obtener(int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
                Solicitud result = dt.ToGenericList<Solicitud>(SolicitudConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new SolicitudGetException(ex);
            }
        }

        public static void Guardar(Solicitud solicitud)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_PROC";
                repo.AddParameter("@ACCION ", solicitud.Persistencia);
                repo.AddParameter("@ID", solicitud.OID);
                repo.AddParameter("@NUMERO", solicitud.Numero);
                repo.AddParameter("@FECHA", solicitud.FechaSolicitud);
                repo.AddParameter("@DISTANCIA", solicitud.Distancia == null ? (int?) null : solicitud.Distancia.OID);
                repo.AddParameter("@IDENTIDAD", solicitud.Entidad == null ? (int?) null : solicitud.Entidad.OID);
                repo.AddParameter("@IDAREA", solicitud.Area == null ? (int?)null : solicitud.Area.OID);
                repo.AddParameter("@IDPERSONA",solicitud.Persona == null ? (int?)null : solicitud.Persona.OID);
                repo.AddParameter("@MOTIVO", solicitud.Motivo);
                repo.AddParameter("@MAILPERSONA", solicitud.Mail);
                repo.AddParameter("@FECHASALIDA", solicitud.FechaSalida);
                repo.AddParameter("@FECHARETORNO", solicitud.FechaRetorno);
                repo.AddParameter("@OBSERVACIONES", solicitud.Observaciones);
                repo.AddParameter("@VIATICO", solicitud.SolicitaViaticos);
                repo.AddParameter("@EVENTONOMBRE", solicitud.EventoNombre);
                repo.AddParameter("@EVENTOFECHAINICIO", solicitud.FechaEvento);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                solicitud.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();
               GestorBitacora.Guardar(solicitud);
                
                GestorTramo.Guardar(solicitud);
                

            }
            catch (Exception ex)
            {
                throw new SolicitudSaveException(ex);
            }
        }
        public static void Eliminar(Solicitud solicitud)
        {
            solicitud.Persistencia = EstadoPersistencia.DELETE;
            Guardar(solicitud);
            solicitud.Persistencia = EstadoPersistencia.UPDATE;
            solicitud.Activo = false;
        }


        public static void ReActivar(Solicitud solicitud)
        {
            solicitud.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(solicitud);
            solicitud.Persistencia = EstadoPersistencia.UPDATE;
            solicitud.Activo = true;
        }

        public static List<Solicitud> Consultar(Solicitud solicitud)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@ACTIVO", solicitud.Activo);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<Solicitud> result = dt.ToGenericList<Solicitud>(SolicitudConverter);
                return result;

            }
            catch (Exception ex)
            {
                throw new SolicitudGetException(ex);
            }
        }


        public static List<Solicitud> Consultar()
        {
            return Consultar(new Solicitud { Activo = true });
        }


        public static List<Solicitud> SolicitudesSinRendicion()
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_SP";
                repo.AddParameter("@ACCION", "SOLICITUDSINREN");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@ACTIVO", true);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                DataTable dt = repo.ExecuteDataTable();
                List<Solicitud> result = dt.ToGenericList<Solicitud>(SolicitudConverter);
                return result;

            }
            catch (Exception ex)
            {
                throw new SolicitudGetException(ex);
            }
        }

        public static bool SolicitudTieneRendicion(Solicitud solicitud)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_SP";
                repo.AddParameter("@ACCION", "TIENEREN");
                repo.AddParameter("@ID", solicitud.OID);
                repo.AddParameter("@ACTIVO", true);
                int count = repo.ExecuteScalar().ToInteger();

                return (count > 0); // si es > 0 tiene rend asociada

            }
            catch (Exception ex)
            {
                throw new SolicitudGetException(ex);
            }
        }

        public static bool SolicitudTieneAnticipo(Solicitud solicitud)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_SP";
                repo.AddParameter("@ACCION","TIENEANTICIPO");
                repo.AddParameter("@ID",solicitud.OID);
                repo.AddParameter("@ACTIVO",true);
             
                object result = repo.ExecuteScalar();
                if (result == null) return false;
                return true;

               // return (count  > 0); // si es > 0 tiene anticipo asociada

            }
            catch (Exception ex)
            {
                throw new SolicitudGetException(ex);
                
            }
        }


        public static decimal TraerAnticipoSolicitud(Solicitud solicitud)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "SOLICITUDES_SP";
                repo.AddParameter("@ACCION", "TRAERTOTALES");
                repo.AddParameter("@ID", solicitud.OID);
                repo.AddParameter("@ACTIVO", true);
                decimal total = repo.ExecuteScalar().ToDecimal();

                return total; // si es > 0 tiene anticipo asociada

            }
            catch (Exception ex)
            {
                throw new SolicitudGetException(ex);
            }
        }




        #region Converter

        public static Solicitud SolicitudConverter(DataRow row)
        {
            Solicitud solicitud = new Solicitud
            {
                OID = row["solID"].ToInteger(),
                Persistencia = EstadoPersistencia.UPDATE,
                Numero = row["solNUMERO"].ToInteger(),
                Entidad = GestorEntidades.Obtener(row["solIDENTIDAD"].ToInteger())??null,
                Area = GestorArea.Obtener(row["solIDAREA"].ToInteger())??null,
                Persona = GestorPersona.Obtener(row["solIDPERSONA"].ToInteger()),
                Motivo = row["solMOTIVO"].ToString(),
                Mail = row["solMAILPERSONA"].ToString(),
                Distancia = GestorDistancia.Obtener(row["solDistancia"].ToInteger())??null,
                Observaciones = row["solOBSERVACIONES"].ToString(),
                FechaSolicitud = row["solFECHA"].ToDateTime(),
                // ver el tema de sacar la hora de la fecha 
                FechaSalida = row["solFECHASALIDA"].ToDateTime(),
                FechaRetorno = row["solFECHARETORNO"].ToDateTime(),
                FechaEvento = row["solEVENTOFECHAINICIO"].ToNullableDateTime(),
                EventoNombre = row["solEVENTONOMBRE"].ToString(),
                SolicitaViaticos = row["solVIATICOS"].ToBoolean(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };
            solicitud.Tramos = GestorTramo.Consultar(solicitud);
            return solicitud;
        }
        #endregion



    }

}
